//路由守卫实现进度条
import router from './index'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { useUserStore } from '@/stores'

/**
 * 配置NProgress进度条选项
 * 设置进度条的显示效果和行为
 */
NProgress.configure({
  easing: 'ease', // 动画方式
  speed: 500, // 递增进度条的速度
  showSpinner: false, // 是否显示加载ico
  trickleSpeed: 200, // 自动递增间隔
  minimum: 0.3, // 初始化时的最小百分比
})

/**
 * 全局前置守卫
 * 在路由跳转前执行，启动进度条和权限验证
 */
router.beforeEach(async (to, from, next) => {
  // 开始进度条
  NProgress.start()

  // 设置页面标题
  if (to.meta.title) {
    document.title = `${to.meta.title} - ${import.meta.env.VITE_APP_TITLE}`
  } else {
    document.title = `${import.meta.env.VITE_APP_TITLE}`
  }

  const userStore = useUserStore()

  // 如果要去登录页面，直接放行
  if (to.name === 'Login') {
    // 如果已经登录了，重定向到首页
    if (userStore.token) {
      next({ name: 'Home' })
      return
    }
    next()
    return
  }
  // 检查token
  if (!userStore.token) {
    // 没有token，跳转到登录页
    next({ name: 'Login', query: { redirect: to.fullPath } })
    return
  }

  // 有token，检查用户信息和动态路由
  if (!userStore.userInfo || userStore.userAllRoutes.length === 0) {
    try {
      // 获取用户信息并加载动态路由
      await userStore.userInfoReq()
      // 路由已经动态添加，需要重新导航到目标路由
      next({ ...to, replace: true })
    } catch (error) {
      console.error('获取用户信息失败:', error)
      // 获取用户信息失败，清除token并跳转到登录页
      await userStore.logout()
      next({ name: 'Login', query: { redirect: to.fullPath } })
    }
    return
  }

  // 一切正常，放行
  next()
})

/**
 * 全局后置钩子
 * 在路由跳转完成后执行，结束进度条
 */
router.afterEach(() => {
  // 结束进度条
  NProgress.done()
})

/**
 * 全局解析守卫
 * 在导航被确认之前，同时在所有组件内守卫和异步路由组件被解析之后调用
 */
router.beforeResolve((to, from, next) => {
  // 可以在这里添加一些解析前的逻辑
  next()
})
